package com.atguigu.gulimall.product;

import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.cloud.client.discovery.EnableDiscoveryClient;
import org.springframework.cloud.openfeign.EnableFeignClients;
import org.springframework.session.data.redis.config.annotation.web.http.EnableRedisHttpSession;


/**
 *
 *
 * 3、服务端校验，防止绕过前端页面直接发送请求， 例如 使用postman发送
 *      使用JSR303
 *      1）、给Bean添加校验注解，并定义自己的message提示（在entity）
 *      2)、开启校验功能（@Valid）， 告诉spring数据传过来需要校验（在controller）
 *          校验错误后会有默认响应
 *      3)、给校验的bean后紧跟一个BindingResult，就可以获得到校验的结果
 *
 *      4)、分组校验 例如新增和修改想要校验的字段是不一样的
 *          JSR303分组校验功能（多场景的校验），
 *          1）、校验注解上有个属性 groups : 给校验注解标注什么情况需要进行校验
 *          2）、@Validated(AddGroup.class)
 *          3）、默认没有指定分组的校验注解，在分组校验@Validated(AddGroup.class)的情况下不生效，只会在@Validated的情况下生效
 *
 *       5)、自定义校验
 *          1)、编写一个自定义的校验注解 @ListValue
 *          2）、编写一个自定义的校验器 ListValueConstraintValidator 实现 ConstraintValidator
 *          3）、关联（@Constraint(validatedBy = { ListValueConstraintValidator.class 【可以指定多个不同的校验器，适配不同类型的注解】})）自定义的校验器和自定义的校验注解 ： 让校验器校验标注了校验注解的字段
 *
 * 4、统一异常处理
 * 使用SpringMVC提供的@ControllerAdvice功能
 * 1、抽取一个异常处理类(GulimallExceptionAdvice)
 * 2、使用@ExceptionHandler标注方法可以处理的异常
 */


@EnableRedisHttpSession
@EnableFeignClients(basePackages = "com.atguigu.gulimall.product.feign")
@MapperScan("com.atguigu.gulimall.product.dao")
@SpringBootApplication
@EnableDiscoveryClient
public class GulimallProductApplication {

    public static void main(String[] args) {
        SpringApplication.run(GulimallProductApplication.class, args);
    }

}
